#pragma once

// ROS 核心依赖
#include "rclcpp/rclcpp.hpp"
#include "rclcpp/node_interfaces/node_parameters_interface.hpp"

// 图像发布与相机内参依赖
#include "image_transport/image_transport.hpp"
#include "sensor_msgs/msg/image.hpp"
#include "sensor_msgs/msg/camera_info.hpp"
#include "camera_info_manager/camera_info_manager.hpp"

// 相机 SDK 依赖
#include "mindvision_camera/mv_camera_sdk.hpp"

// C++ 系统依赖
#include <memory>
#include <thread>
#include <string>

namespace mindvision_camera
{

    class MVCameraNode : public rclcpp::Node
    {
    public:
        /**
         * @brief 节点构造函数
         * @param options ROS 节点选项（如命名空间、参数重映射等）
         */
        explicit MVCameraNode(const rclcpp::NodeOptions &options);

        /**
         * @brief 节点析构函数
         * @note 确保捕获线程正常退出，释放资源
         */
        ~MVCameraNode() override;

    private:
        // -------------------------- 核心初始化函数 --------------------------
        /**
         * @brief 声明 ROS 所有参数（调用 SDK 接口获取默认值和范围）
         */
        void declareAllParameters();

        /**
         * @brief 创建图像发布者（支持 sensor_data QoS 配置）
         */
        void createImagePublisher();

        /**
         * @brief 加载相机内参（从 URL 或默认配置）
         */
        void loadCameraInfo();

        /**
         * @brief 绑定参数回调（处理动态参数修改）
         */
        void bindParametersCallback();

        /**
         * @brief 启动图像捕获线程（循环获取并发布图像）
         */
        void startCaptureThread();
        /**
         * @brief 新增：重启相机和捕获线程（图像失败时调用）
         * 逻辑：释放SDK资源 → 重置USB → 重新初始化相机
         */
        void restartCamera();

        /**
         * @brief 同步参数到相机（将动态参数同步到相机）
         */
        void syncParametersToCamera();

        // --------------------------  回调函数 --------------------------
        /**
         * @brief 动态参数修改回调
         * @param parameters 被修改的参数列表
         * @return rcl_interfaces::msg::SetParametersResult 参数修改结果（成功/失败+原因）
         */
        rcl_interfaces::msg::SetParametersResult parametersCallback(
            const std::vector<rclcpp::Parameter> &parameters);

        // --------------------------  成员变量 --------------------------
        MVCameraSDK camera_sdk_; // 相机 SDK 封装对象

        // 图像发布相关
        image_transport::CameraPublisher camera_pub_;  // 图像+内参联合发布者
        sensor_msgs::msg::Image image_msg_;            // 图像消息缓存
        sensor_msgs::msg::CameraInfo camera_info_msg_; // 相机内参消息缓存

        // 相机内参管理相关
        std::string camera_name_;                                                     // 相机名称（用于内参管理器）
        std::unique_ptr<camera_info_manager::CameraInfoManager> camera_info_manager_; // 内参管理器

        //第二套相机内参scope
        std::unique_ptr<camera_info_manager::CameraInfoManager> scope_camera_info_manager_; // 第二套内参管理器
        sensor_msgs::msg::CameraInfo scope_camera_info_msg_;  // 第二套内参消息缓存
        rclcpp::Publisher<sensor_msgs::msg::CameraInfo>::SharedPtr scope_camera_info_pub_; // 第二套内参发布者


        // 动态参数缓存（避免频繁调用 SDK 获取当前值）
        int r_gain_ = 128;                 // RGB 红色通道增益缓存
        int g_gain_ = 128;                 // RGB 绿色通道增益缓存
        int b_gain_ = 128;                 // RGB 蓝色通道增益缓存
        bool flip_image_ = false;          // 图像翻转标志缓存
        bool use_sensor_data_qos_ = false; // 是否使用 sensor_data QoS 缓存

        // 线程与状态管理
        std::thread capture_thread_;                                      // 图像捕获线程
        OnSetParametersCallbackHandle::SharedPtr params_callback_handle_; // 参数回调句柄
    };

} // namespace mindvision_camera